find_library(libubox ubox)
target_link_libraries(${PROJECT_NAME} PRIVATE ${libubox})
-
-# Optional Features
-if (${EXT_CER_ID})
- target_compile_definitions(${PROJECT_NAME} PRIVATE EXT_CER_ID=${EXT_CER_ID})
-endif(${EXT_CER_ID})
-
if(${UBUS})
target_compile_definitions(${PROJECT_NAME} PRIVATE WITH_UBUS)
target_sources(${PROJECT_NAME} PRIVATE src/ubus.c)
* Configurable SOL_MAX_RT
* DS-Lite AFTR-Name Option
* Softwire address and port mapped clients (MAP, LW4over6)
- * CER-ID (experimental)
* Server unicast Option
4. Support for requesting and parsing Router Advertisements
| `RA_REACHABLE` | ND Reachability time |
| `RA_RETRANSMIT` | ND Retransmit time |
| `AFTR` | The DS-Lite AFTR domain name |
-| `CER` | A space-separated list of CER-id IPv6 |
| `MAPE` / `MAPT` / `LW4O6` | Softwire rules for MAPE, MAPT and LW4O6 |
| `PASSTHRU` | The content of the last packet relayed |
htons(DHCPV6_OPT_SNTP_SERVERS),
htons(DHCPV6_OPT_NTP_SERVER),
htons(DHCPV6_OPT_PD_EXCLUDE),
-#ifdef EXT_CER_ID
- htons(DHCPV6_OPT_CER_ID),
-#endif
};
odhcp6c_add_state(STATE_ORO, oro, sizeof(oro));
}
odhcp6c_clear_state(STATE_SIP_IP);
odhcp6c_clear_state(STATE_SIP_FQDN);
odhcp6c_clear_state(STATE_AFTR_NAME);
- odhcp6c_clear_state(STATE_CER);
odhcp6c_clear_state(STATE_S46_MAPT);
odhcp6c_clear_state(STATE_S46_MAPE);
odhcp6c_clear_state(STATE_S46_LW);
if (inf_max_rt >= DHCPV6_INF_MAX_RT_MIN &&
inf_max_rt <= DHCPV6_INF_MAX_RT_MAX)
dhcpv6_retx[DHCPV6_MSG_INFO_REQ].max_timeo = inf_max_rt;
- #ifdef EXT_CER_ID
- } else if (otype == DHCPV6_OPT_CER_ID && olen == -4 +
- sizeof(struct dhcpv6_cer_id)) {
- struct dhcpv6_cer_id *cer_id = (void*)&odata[-4];
- struct in6_addr any = IN6ADDR_ANY_INIT;
- if (memcmp(&cer_id->addr, &any, sizeof(any)))
- odhcp6c_add_state(STATE_CER, &cer_id->addr, sizeof(any));
- #endif
} else if (otype == DHCPV6_OPT_S46_CONT_MAPT) {
odhcp6c_add_state(STATE_S46_MAPT, odata, olen);
} else if (otype == DHCPV6_OPT_S46_CONT_MAPE) {
{ .code = DHCPV6_OPT_RADIUS, .flags = OPT_INTERNAL | OPT_NO_PASSTHRU, .str = NULL },
{ .code = DHCPV6_OPT_SOL_MAX_RT, .flags = OPT_INTERNAL | OPT_NO_PASSTHRU | OPT_ORO | OPT_ORO_SOLICIT, .str = NULL },
{ .code = DHCPV6_OPT_INF_MAX_RT, .flags = OPT_INTERNAL | OPT_NO_PASSTHRU | OPT_ORO | OPT_ORO_STATELESS, .str = NULL },
-#ifdef EXT_CER_ID
- { .code = DHCPV6_OPT_CER_ID, .flags = OPT_INTERNAL | OPT_NO_PASSTHRU, .str = NULL },
-#endif
{ .code = DHCPV6_OPT_DHCPV4_MSG, .flags = OPT_INTERNAL | OPT_NO_PASSTHRU, .str = NULL },
{ .code = DHCPV6_OPT_S46_RULE, .flags = OPT_INTERNAL | OPT_NO_PASSTHRU, .str = NULL },
{ .code = DHCPV6_OPT_S46_BR, .flags = OPT_INTERNAL | OPT_NO_PASSTHRU, .str = NULL },
DHCPV6_OPT_RADIUS = 81,
DHCPV6_OPT_SOL_MAX_RT = 82,
DHCPV6_OPT_INF_MAX_RT = 83,
-#ifdef EXT_CER_ID
- /* draft-donley-dhc-cer-id-option-03 */
- DHCPV6_OPT_CER_ID = EXT_CER_ID,
-#endif
DHCPV6_OPT_DHCPV4_MSG = 87,
/* RFC 7598 */
DHCPV6_OPT_S46_RULE = 89,
uint8_t key[16];
} _o_packed;
-struct dhcpv6_cer_id {
- uint16_t type;
- uint16_t len;
- struct in6_addr addr;
-} _o_packed;
-
struct dhcpv6_s46_portparams {
uint8_t offset;
uint8_t psid_len;
STATE_RA_SEARCH,
STATE_AFTR_NAME,
STATE_OPTS,
- STATE_CER,
STATE_S46_MAPT,
STATE_S46_MAPE,
STATE_S46_LW,
} else if (pid == 0) {
size_t dns_len, search_len, custom_len, sntp_ip_len, ntp_ip_len, ntp_dns_len;
- size_t sip_ip_len, sip_fqdn_len, aftr_name_len, cer_len, addr_len;
+ size_t sip_ip_len, sip_fqdn_len, aftr_name_len, addr_len;
size_t s46_mapt_len, s46_mape_len, s46_lw_len, passthru_len;
signal(SIGTERM, SIG_DFL);
struct in6_addr *sip = odhcp6c_get_state(STATE_SIP_IP, &sip_ip_len);
uint8_t *sip_fqdn = odhcp6c_get_state(STATE_SIP_FQDN, &sip_fqdn_len);
uint8_t *aftr_name = odhcp6c_get_state(STATE_AFTR_NAME, &aftr_name_len);
- struct in6_addr *cer = odhcp6c_get_state(STATE_CER, &cer_len);
uint8_t *s46_mapt = odhcp6c_get_state(STATE_S46_MAPT, &s46_mapt_len);
uint8_t *s46_mape = odhcp6c_get_state(STATE_S46_MAPE, &s46_mape_len);
uint8_t *s46_lw = odhcp6c_get_state(STATE_S46_LW, &s46_lw_len);
fqdn_to_env("DOMAINS", search, search_len);
fqdn_to_env("SIP_DOMAIN", sip_fqdn, sip_fqdn_len);
fqdn_to_env("AFTR", aftr_name, aftr_name_len);
- ipv6_to_env("CER", cer, cer_len / sizeof(*cer));
s46_to_env(STATE_S46_MAPE, s46_mape, s46_mape_len);
s46_to_env(STATE_S46_MAPT, s46_mapt, s46_mapt_len);
s46_to_env(STATE_S46_LW, s46_lw, s46_lw_len);
{
char *buf = NULL;
size_t dns_len, search_len, custom_len, sntp_ip_len, ntp_ip_len, ntp_dns_len;
- size_t sip_ip_len, sip_fqdn_len, aftr_name_len, cer_len, addr_len;
+ size_t sip_ip_len, sip_fqdn_len, aftr_name_len, addr_len;
size_t s46_mapt_len, s46_mape_len, s46_lw_len, passthru_len;
struct in6_addr *addr = odhcp6c_get_state(STATE_SERVER_ADDR, &addr_len);
struct in6_addr *dns = odhcp6c_get_state(STATE_DNS, &dns_len);
struct in6_addr *sip = odhcp6c_get_state(STATE_SIP_IP, &sip_ip_len);
uint8_t *sip_fqdn = odhcp6c_get_state(STATE_SIP_FQDN, &sip_fqdn_len);
uint8_t *aftr_name = odhcp6c_get_state(STATE_AFTR_NAME, &aftr_name_len);
- struct in6_addr *cer = odhcp6c_get_state(STATE_CER, &cer_len);
uint8_t *s46_mapt = odhcp6c_get_state(STATE_S46_MAPT, &s46_mapt_len);
uint8_t *s46_mape = odhcp6c_get_state(STATE_S46_MAPE, &s46_mape_len);
uint8_t *s46_lw = odhcp6c_get_state(STATE_S46_LW, &s46_lw_len);
CHECK(fqdn_to_blob("DOMAINS", search, search_len));
CHECK(fqdn_to_blob("SIP_DOMAIN", sip_fqdn, sip_fqdn_len));
CHECK(fqdn_to_blob("AFTR", aftr_name, aftr_name_len));
- CHECK(ipv6_to_blob("CER", cer, cer_len / sizeof(*cer)));
CHECK(s46_to_blob(STATE_S46_MAPE, s46_mape, s46_mape_len));
CHECK(s46_to_blob(STATE_S46_MAPT, s46_mapt, s46_mapt_len));
CHECK(s46_to_blob(STATE_S46_LW, s46_lw, s46_lw_len));